iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
自我挑戰組

30天用Python打造你的數位金融實力:從零開始的FinTech入門筆記系列 第 22

用 Python 計算等額本息每月應繳與攤還表

  • 分享至 

  • xImage
  •  

在金融產品裡,貸款攤還(amortization) 是非常常見的需求。無論是房貸、車貸或是分期付款,等額本息(每月繳同樣金額)是最常見的還款方式。今天我們把公式寫成 Python 函數,讓你能算出每月應繳、每期本金與利息分攤,並輸出一張清楚的攤還表,幫你回答:「我每月到底要還多少?總利息多少?」

今天目標:

  1. 理解等額本息公式的概念
  2. 用簡單的 Python 產出攤還表與總利息
  3. 產出 CSV(方便放入作品集或上傳到 Excel)

重點概念

等額本息的每月繳款金額是固定的,但每月裡面「利息」隨剩餘本金變少而下降,「本金」成分則逐期增加。總利息 = 每月繳款 × 期數 − 貸款本金。

Python 實作

import csv

def monthly_payment(principal, annual_rate, years):
    """計算每月固定還款(等額本息)
       annual_rate 輸入小數,例如 5% -> 0.05
    """
    n = int(years * 12)
    if annual_rate == 0:
        return principal / n
    r = annual_rate / 12.0
    return principal * (r * (1 + r) ** n) / (((1 + r) ** n) - 1)

def amortization_schedule(principal, annual_rate, years):
    monthly = monthly_payment(principal, annual_rate, years)
    n = int(years * 12)
    balance = principal
    schedule = []
    for i in range(1, n + 1):
        interest = balance * (annual_rate / 12.0)
        principal_paid = monthly - interest
        # 最後一期為避免浮點誤差,將剩餘本金一次還清
        if i == n:
            principal_paid = balance
            monthly = interest + principal_paid
        balance = balance - principal_paid
        schedule.append({
            "期數": i,
            "每期應繳": round(monthly, 2),
            "利息": round(interest, 2),
            "本金": round(principal_paid, 2),
            "剩餘本金": round(balance if balance>0 else 0.0, 2)
        })
    total_paid = sum(row["每期應繳"] for row in schedule)
    total_interest = round(total_paid - principal, 2)
    return schedule, round(monthly, 2), total_interest

# 範例:貸款 1,000,000 元,年利率 2.0%,期數 20 年
P = 1_000_000
annual_rate = 0.02   # 2%
years = 20

schedule, monthly_fixed, total_interest = amortization_schedule(P, annual_rate, years)

print(f"貸款本金:{P:,} 元,年利率:{annual_rate*100:.2f}% ,期數:{years} 年")
print(f"每月應繳:{monthly_fixed:,.2f} 元")
print(f"總利息(估):{total_interest:,.2f} 元")
print("\n前 5 期攤還明細:")
for row in schedule[:5]:
    print(row)

# 可選:把完整攤還表存成 CSV
with open("amortization.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["期數","每期應繳","利息","本金","剩餘本金"])
    writer.writeheader()
    writer.writerows(schedule)
print("\n已將完整攤還表輸出為 amortization.csv")

執行後會得到什麼

  • 每月固定應繳金額(清楚到小數點)
  • 每期拆解:利息、本金、剩餘本金(前幾期與整表)
  • 總利息(方便比較不同利率 / 期數的成本)
  • 一份 amortization.csv,可以拿去做報告或放入你的作品集

延伸練習

  1. 改變 annual_rate / years 看總利息如何變化(體會期數與利率的影響)
  2. 加一個「提前還款」模擬:在第 X 期一次多還 Y 元,觀察總利息節省多少
  3. 把結果用 matplotlib 畫出「利息 vs 本金」堆疊圖

上一篇
用 Python 做一個信用評分小工具
下一篇
保險理賠模擬器:免賠額、共付比、理賠上限怎麼影響保費?
系列文
30天用Python打造你的數位金融實力:從零開始的FinTech入門筆記29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言